//package cqrtplm.aop;
//
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSON;
//import com.hustcad.plm.pdm.middle.partbom.service.TyplmPdmPartService;
//import com.hustcad.plm.pdm.partbom.dto.InsertPartDTO;
//import com.hustcad.plm.pdm.partbom.dto.ModifyPartDTO;
//import com.hustcad.plm.pdm.partbom.enums.PartBomErrorCodeEnum;
//import com.ty.basic.exception.MessageException;
//import com.ty.basic.utils.ArgumentUtils;
//import cqrtplm.constant.RTErrorCodeEnum;
//import cqrtplm.mapper.RtCfgStatusInfoMapper;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.util.LinkedHashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
//@Aspect
//@Component
//public class DevCodeAndProductType {
//
//
//    @Resource
//    private RtCfgStatusInfoMapper rtCfgStatusInfoMapper;
//    @Value("${STATUS_INFO_PARTTYPE}")
//    private String STATUS_INFO_PARTTYPE;
//    @Value("${STATUS_INFO_DEVCODE}")
//    private String STATUS_INFO_DEVCODE;
//
//    /**
//     * 在新增零部件的 针对产品型谱类型的开发令、机型作唯一性校验
//     * 切入insertPart方法，在执行前进行唯一性校验
//     */
//    @Before("execution(* com.hustcad.plm.pdm.partbom.controller.TyplmPartController.insertPart(..))")
//    public void checkPartUniqueness(JoinPoint joinPoint) throws Throwable {
//        // 获取方法参数
//        Object[] args = joinPoint.getArgs();
//
//        HttpServletRequest request = (HttpServletRequest) args[1];
//
//        InsertPartDTO insertPartDto = (InsertPartDTO) JSON.parseObject(request.getParameter("insertPartDto"),
//                                                                       InsertPartDTO.class);
//
//        // 如果insertPartDto为空，直接返回，让原方法继续执行
//        if (!Objects.nonNull(insertPartDto)) {
//            return;
//        }
//
//        String typeOType = insertPartDto.getTypeOType();
//
//        // 只处理特定类型
//        if ("ty.inteplm.part.CTyPart|产品型谱".equals(typeOType)) {
//            // 从descriptionMap中获取devCode和productType的值
//            Map<String, String> descriptionMap = (Map) JSON.parseObject(request.getParameter("ibaAttribute"),
//                                                                        LinkedHashMap.class);
//
//            if (descriptionMap != null) {
//                // 安全地获取devCode和productType
//                String devCode = getStringValueFromMap(descriptionMap, "devCode");
//                String productType = getStringValueFromMap(descriptionMap, "productType");
//
//                // 检查devCode是否已存在
//                if (StrUtil.isNotBlank(devCode)) {
//                    boolean devCodeExists = rtCfgStatusInfoMapper.existsByDevCodeOrProductType(STATUS_INFO_DEVCODE,
//                                                                                               devCode,null);
//                    if (devCodeExists) {
//                        // 检查RTErrorCodeEnum是否支持自定义消息
//                        if (RTErrorCodeEnum.DEV_CODE_EXIST.getException("开发令已存在: " + devCode) instanceof MessageException) {
//                            MessageException ex = (MessageException) RTErrorCodeEnum.DEV_CODE_EXIST.getException("");
//                            ex.setErrorMsg("开发令已存在: " + devCode);
//                            throw ex;
//                        } else {
//                            throw new RuntimeException("开发令已存在: " + devCode);
//                        }
//                    }
//                }
//
//                // 检查productType是否已存在
//                if (StrUtil.isNotBlank(productType)) {
//                    boolean productTypeExists = rtCfgStatusInfoMapper.existsByDevCodeOrProductType(STATUS_INFO_PARTTYPE,
//                                                                                                   productType,null);
//                    if (productTypeExists) {
//                        // 检查RTErrorCodeEnum是否支持自定义消息
//                        if (RTErrorCodeEnum.PRODUCT_TYPE_EXIST.getException("机型已存在: " + productType) instanceof MessageException) {
//                            MessageException ex = (MessageException) RTErrorCodeEnum.DEV_CODE_EXIST.getException("");
//                            ex.setErrorMsg("机型已存在: " + productType);
//                            throw ex;
//                        } else {
//                            throw new RuntimeException("机型已存在: " + productType);
//                        }
//
//                    }
//                }
//            }
//        }
//    }
//
//    // 辅助方法：安全地从Map中获取字符串值
//    private String getStringValueFromMap(Map<String, String> map, String key) {
//        Object value = map.get(key);
//        if (value == null) {
//            return null;
//        }
//
//        if (value instanceof String) {
//            return (String) value;
//        } else if (value instanceof com.alibaba.fastjson.JSONArray) {
//            com.alibaba.fastjson.JSONArray array = (com.alibaba.fastjson.JSONArray) value;
//            return array.isEmpty() ? null : array.getString(0);
//        } else {
//            return value.toString();
//        }
//    }
//
//    @Before("execution(* com.hustcad.plm.pdm.partbom.controller.TyplmPartController.updatePart(..))")
//    public void checkPartUniquenessByUpdate(JoinPoint joinPoint) throws Throwable {
//        // 获取方法参数
//        Object[] args = joinPoint.getArgs();
//
//        ModifyPartDTO arg = (ModifyPartDTO) args[0];
//        if (!Objects.nonNull(arg)){
//            return;
//        }
//        Long l = rtCfgStatusInfoMapper.selectTypeOidByTypeName("ty.inteplm.part.CTyPart|产品型谱");
//        if (l == null){
//            return;
//        }
//
//        // 只处理特定类型
//        if (l.equals(arg.getTypeOid())) {
//            // 从descriptionMap中获取devCode和productType的值
//            LinkedHashMap<String, List<String>> ibaAttributeMap = arg.getIbaAttributeMap();
//
//            // 安全地获取devCode和productType
//                String devCode = ibaAttributeMap.get("devCode").get(0);
//                String productType = ibaAttributeMap.get("productType").get(0);
//
//                // 检查devCode是否已存在
//                if (StrUtil.isNotBlank(devCode)) {
//                    boolean devCodeExists = rtCfgStatusInfoMapper.existsByDevCodeOrProductType(STATUS_INFO_DEVCODE,
//                            devCode,arg.getOId());
//                    if (devCodeExists) {
//                        // 检查RTErrorCodeEnum是否支持自定义消息
//                        if (RTErrorCodeEnum.DEV_CODE_EXIST.getException("开发令已存在: " + devCode) instanceof MessageException) {
//                            MessageException ex = (MessageException) RTErrorCodeEnum.DEV_CODE_EXIST.getException("");
//                            ex.setErrorMsg("开发令已存在: " + devCode);
//                            throw ex;
//                        } else {
//                            throw new RuntimeException("开发令已存在: " + devCode);
//                        }
//                    }
//                }
//
//                // 检查productType是否已存在
//                if (StrUtil.isNotBlank(productType)) {
//                    boolean productTypeExists = rtCfgStatusInfoMapper.existsByDevCodeOrProductType(STATUS_INFO_PARTTYPE,
//                            productType,arg.getOId());
//                    if (productTypeExists) {
//                        // 检查RTErrorCodeEnum是否支持自定义消息
//                        if (RTErrorCodeEnum.PRODUCT_TYPE_EXIST.getException("机型已存在: " + productType) instanceof MessageException) {
//                            MessageException ex = (MessageException) RTErrorCodeEnum.DEV_CODE_EXIST.getException("");
//                            ex.setErrorMsg("机型已存在: " + productType);
//                            throw ex;
//                        } else {
//                            throw new RuntimeException("机型已存在: " + productType);
//                        }
//
//                    }
//                }
//            }
//
//    }
//}